/*
 * SetVar.java
 *
 * Created on June 1, 2007, 12:44 AM
 *
 *
 *  Copyright (C) 2010 Tal Eisenberg
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package base;

import java.util.ArrayList;
import java.util.List;
import tal.drivechain.matchers.VarMatcher;
import tal.drivechain.plugin.Channel;
import tal.drivechain.plugin.Module;
import tal.drivechain.variable.Variable;

import tal.drivechain.variable.SetProperty;
import tal.drivechain.variable.VarTableAction;

/**
 *
 * @author Main
 */
public class SetVar extends Module {
    List<Object[]> idVar;
    List<VarTableAction> actions;
    VarMatcher trigger = null;
    
    @Override
    public void setupProperties() {
        setTrigger(props.getProperty("trigger"), null);
        setIdentifierVariable(props.getProperty("identifierVariable"), null);
    }

    public void setTrigger(Object value, SetProperty.Flag flag) {
        trigger = (VarMatcher)value;
    } public Object getTrigger() { return trigger; }

    public void setIdentifierVariable(Object value, SetProperty.Flag flag) {
        if (flag==SetProperty.Flag.ADD)
            idVar.addAll((List)value);
        else idVar = (List)value;

        actions = new ArrayList<VarTableAction>();
        for (Object[] item : idVar) {
            if (!(item[0] instanceof VarTableAction))
                actions.add(VarTableAction.parseAction(VarTableAction.Action.SET_ANY, (String)item[0]));
        }
    } public Object getIdentifierVariable() { return idVar; }

    public void commandSetVar(List<Variable> parameters) {
        for (Variable var : parameters)
            setVar(VarTableAction.parseAction(VarTableAction.Action.SET_ANY, var.getName()), var);
    }

    private void setVar(VarTableAction action, Variable var) {
        try {
            if (var.isEvaluateAtHome())
                var = var.evaluate(this);
            if (infoFlag) log("Storing global variable: " + var.toString(this), MSG.INFO);
            action.set(var, getParentChain().getVarTable(), this);
        } catch (IllegalArgumentException ie) {
            log(ie.getMessage(), MSG.WARNING);
        }
    }
    
    @Override
    protected void msgReceived(Variable in, long timestamp, Channel channel) {
        if (trigger.matches(in, channel, this)) {
            if (debugFlag)
                log("Received matching trigger: " + in, MSG.DEBUG);
            for (int i=0; i<idVar.size(); i++) {
                Variable var = (Variable)((Object[])idVar.get(i))[1];
                setVar(actions.get(i), var);
            }
        }
    }    

}
